#include <ncurses.h>
#include "ncursesJeu.h"
#include "jeu.h"
#include <assert.h>
#include <time.h>

void ncursesAffichage( WINDOW* fen, const Jeu *pJeu)
{
    int x,y;

    const Terrain *pTerrain;
    const Personnage *pPersonnage;

    pTerrain= jeuGetConstTerrain(pJeu);
    pPersonnage= jeuGetConstPersonnage(pJeu);

    wclear(fen);
   for(x=0; x<terrainGetX(pTerrain); x++)

        for(y=0; y<terrainGetY(pTerrain); y++)
        	if(terrainGetCase(pTerrain,x,y) != vide)
          	  mvwprintw( fen, y, x, "%d", terrainGetCase(pTerrain,x,y));


    mvwprintw(fen,(int)personnageGetPosY(pPersonnage),(int)personnageGetPosX(pPersonnage), "X" );
    wmove( fen,personnageGetPosY(pPersonnage),personnageGetPosX(pPersonnage));


    mvwprintw(fen,terrainGetY(pTerrain),0, "PosX %.03f",personnageGetPosX(pPersonnage) );
    mvwprintw(fen,terrainGetY(pTerrain),7, "PosY %.03f",personnageGetPosY(pPersonnage));
    mvwprintw(fen,terrainGetY(pTerrain),17, "VitesseX :%.03f", vectGetX(&(pPersonnage->vitesse)));
    mvwprintw(fen,terrainGetY(pTerrain),33, "VitesseY :%.03f", vectGetY(&(pPersonnage->vitesse)));
    mvwprintw(fen,terrainGetY(pTerrain)+1,0, "accelX :%.03f",vectGetX(&(pPersonnage->acceleration)));
    mvwprintw(fen,terrainGetY(pTerrain)+1,16, "accelY : %.03f", vectGetY(&(pPersonnage->acceleration)));
    mvwprintw(fen,terrainGetY(pTerrain),47, "g : %d", personnageGetSaut(pPersonnage));
}

void ncursesBoucle(Jeu *pJeu)
{
    WINDOW *fen, *ecran;
    int c;
    int continue_boucle;

    /* Horloges (en secondes) */
    float horloge_courante, horloge_precedente;

    /* Intervalle de temps (en secondes) entre deux évolutions du jeu */
    float intervalle_horloge = 0.0009f;

    ecran = initscr();		/* passe l'écran texte en mode NCurses */
    clear();		/* efface l'écran */
    noecho();  	/* Lorsqu'une touche est préssée au clavier, elle n'apparait pas a à l'écran */
    cbreak();		/* un caractère est directement affiché, il ne passe pas dans un buffer */

    /* Creation d'une nouvelle fenetre en mode texte */
    /* => fenetre de dimension et position ( WIDTH, HEIGHT, STARTX,STARTY) */
    fen = newwin( terrainGetY(jeuGetConstTerrain(pJeu))+2, terrainGetX(jeuGetConstTerrain(pJeu)), 10, 5);
    keypad(fen, TRUE);		/* pour que les flèches soient traitées (il faut le faire après création de la fenêtre) */

    /* halfdelay(temps_dizieme);*/
    /* notimeout(win,true);*/
    /*wtimeout( win, 500 );*/
    nodelay(fen,true); /* Pour que l'appel à wgetch soit non-bloquant : on ne doit pas appuyer sur entrée après une touche ! */
    continue_boucle = 1;

    /* Récupère l'horloge actuelle et la convertit en secondes */
    /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
    horloge_precedente = (float)clock()/(float)CLOCKS_PER_SEC;

    ncursesAffichage(fen,pJeu);

    do
    {
        /* Récupère l'horloge actuelle et la convertit en secondes */
        /* clock() retourne le nombre de tops horloge depuis le lancement du programme */
        horloge_courante = (float)clock()/(float)CLOCKS_PER_SEC;
        if (horloge_courante-horloge_precedente>=intervalle_horloge)
        {
            jeuEvolue(pJeu);
            ncursesAffichage(fen, pJeu);
            horloge_precedente = horloge_courante;
            c = wgetch(fen);
            switch(c)
            {
            case 113:
                jeuActionClavier( pJeu, 'g'); /* touche q */
                ncursesAffichage(fen, pJeu);
                break;
            case 100:
                jeuActionClavier( pJeu, 'd'); /* touche d */
                ncursesAffichage(fen, pJeu);
                break;
            case 32:
                jeuActionClavier( pJeu, 's'); /* touche espace */
                ncursesAffichage(fen, pJeu);
                break;
            case 27: /* ECHAP */
                continue_boucle = 0;
                break;
            default :
                personnageDeceleration(&(pJeu->personnage));
            }
           /* while(getch(c)!='\n');*/
        }
    }while (continue_boucle==1);

    assert(delwin(fen)!=ERR);
    assert(delwin(ecran)!=ERR);

    endwin();
}


